/**
 * 文件描述：公共方法
 * 创建时间：2023/9/6 17:04
 * 创建人：二
 */
import store from '@/store'
import { MessageBox, Message } from 'element-ui';

/**
 * 登录过期
 */
export function againLogin() {
	MessageBox.alert('登录状态已过期，请您重新登录', '系统提示', {
		confirmButtonText: '重新登录',
		type: 'warning',
		showClose: false
	}).then(() => {
		store.dispatch('exitLogin').finally()
	})
}

/**
 * 文件地址拼接
 * @param {string} str
 * @returns {string}
 */
export function fileUrl(str) {
	if (typeof (str) !== 'string') return str;
	// 判断是否为网络地址
	if (str.indexOf('https://') !== -1 || str.indexOf('http://') !== -1) {
		return str
	}
	return process.env.VUE_APP_URL + str;
}

/**
 * 计算总页数
 * @param {Number} total 总数
 * @param {Number} limit 每页数量
 * @returns {number}
 */
export function totalPageNum(total, limit) {
	return Math.ceil(total / limit);
}

/**
 * 对象赋值
 * @param {Object} obj 赋值对象
 * @param {Object} data 数据对象
 * @returns {*}
 */
export function objAssign(obj, data) {
	Object.keys(obj).forEach(key => {
		obj[key] = data[key];
	});
	return obj;
}

/**
 * 数组对象去重
 * @param {Array} data 数组对象
 * @param {string} key 去重字段
 * @returns {*|*[]}
 */
export function arrayObjDedUp(data, key) {
	let newList = []; const hash = {};
	newList = data.reduce((item, next) => {
		if (!hash[next[key]]) {
			hash[next[key]] = true;
			item.push(next);
		}
		return item;
	}, []);
	return newList;
}

/**
 * 复制到剪切板
 * @param {string} data 复制内容
 */
export function handleCopy(data) {
	navigator.clipboard.writeText(data).then(() => {
		Message({
			message: '复制成功',
			type: 'success'
		})
	}).catch(() => {
		Message({
			message: '复制失败',
			type: 'error'
		})
	})
}

/**
 * 数字计算
 * @param {number} num1
 * @param {number} num2
 * @param {string} type 计算类型
 * @param {number} fixed 保留小数
 * @returns {string}
 */
export function numberCalculate(num1, num2, type, fixed = 2) {
	if (isNaN(num1) || isNaN(num2)) {
		return '';
	}
	let sum = 1;
	if (!Number.isInteger(Number(num1)) || !Number.isInteger(Number(num2))) {
		sum = Math.pow(10, fixed);
	}
	let newNum1;
	let newNum2;
	switch (type) {
		case '+':
			newNum1 = num1 * sum;
			newNum2 = num2 * sum;
			return ((newNum1 + newNum2) / sum).toFixed(fixed);
		case '-':
			newNum1 = num1 * sum;
			newNum2 = num2 * sum;
			return ((newNum1 - newNum2) / sum).toFixed(fixed);
		case '*':
			newNum1 = Number.isInteger(Number(num1)) ? Number(num1) : num1 * sum;
			newNum2 = Number.isInteger(Number(num2)) ? Number(num2) : num2 * sum;
			return ((newNum1 * newNum2) / sum).toFixed(fixed);
		case '/':
			newNum1 = Number.isInteger(Number(num1)) ? Number(num1) : num1 * sum;
			newNum2 = Number.isInteger(Number(num2)) ? Number(num2) : num2 * sum;
			return ((newNum1 / newNum2) / sum).toFixed(fixed);
	}
}

/**
 * 获取选中的级联数据
 * @param {Array} val 选中的值
 * @param {Array} opt 级联数据
 * @return {Array}
 */
export function getCascaderSelectObj(val, opt) {
	return val.map(function (value) {
		for (const itm of opt) {
			if (itm.value === value) { opt = itm.children; return itm; }
		}
		return null;
	});
}
/**
 * tree数据查找所有上级
 * @param tree 树形数据
 * @param val 子级值
 * @param props 配置选项
 * @param props.field 比对字段
 * @param props.children 指定选项的子选项为选项对象的某个属性值
 * @param path
 */
export function treeFindPath (tree, val, props = {}, path = []) {
	const field = props.field || 'id'; const children = props.children || 'children';
	if (!tree) return []
	for (const data of tree) {
		// 这里按照你的需求来存放最后返回的内容吧
		path.push(data[field])

		if (val === data[field]) {
			return path
		}
		if (data[children]) {
			const findChildren = this.treeFindPath(data[children], val, { field, children }, path)
			if (findChildren.length) {
				return findChildren
			}
		}
		path.pop()
	}
	return []
}
/**
 * 链接下载文件
 * @param href
 * @param filename 自定义文件名称
 */
export function downloadHrefFile(href, filename) {
	const link = document.createElement('a');
	if (typeof (href) !== 'string') return;
	link.href = process.env.VUE_APP_URL + href;
	// 判断是否为网络地址
	if (href.indexOf('https://') !== -1 || href.indexOf('http://') !== -1) {
		link.href = href;
	}
	// console.log('filename', filename)
	if (filename) {
		link.setAttribute('download', filename);
	}
	document.body.appendChild(link);
	link.click();
	link.remove();
}
/**
 * 下载文件
 * @param data 二进制数据
 * @param filename 自定义文件名称
 */
export function downloadFile(data, filename) {
	// 验证是否为blob格式
	if(data.type !== 'application/json') {
		const blob = new Blob([data]);
		const href = window.URL.createObjectURL(blob);
		const link = document.createElement('a');
		link.href = href;
		if (filename) {
			link.setAttribute('download', filename);
		}
		document.body.appendChild(link);
		link.click();
		link.remove();
	}
}

/**
 * 确认框
 */
export function messageBoxConfirm(message) {
	return new Promise((resolve, reject) => {
		MessageBox.confirm(message, '提示',{
			confirmButtonText: '确定',
			cancelButtonText: '取消',
			type: 'warning',
			beforeClose: (action, instance, done) => {
				if (action !== 'confirm') {
					done();
					return reject();
				}
				instance.confirmButtonLoading = true;
				instance.confirmButtonText = '执行中...';
				return resolve({
					done,
					instance
				})
			}
		}).catch(() => {})
	})

}
